/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.gui.table;

import com.camachosanchez.bean.Neumaticos;
import com.camachosanchez.util.Constantes;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;

/**
 *
 * @author Sam
 */
public class ModeloTablaBuscarNeumatico implements TableModel {

    private LinkedList datos = new LinkedList();
    private LinkedList listeners = new LinkedList();

    @Override
    public int getRowCount() {
        return datos.size();
    }

    @Override
    public int getColumnCount() {
        return 22;
    }

    @Override
    public String getColumnName(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return "";
            case 1:
                return "id";
            case 2:
                return "CÓDIGO";
            case 3:
                return "SERIE";
            case 4:
                return "MEDIDA";
            case 5:
                return "MARCA";
            case 6:
                return "UBICACIÓN";
            case 7:
                return "CODIGO V.";
            case 8:
                return "PLACA V.";
            case 9:
                return "POS EN V.";
            case 10:
                return "ESTADO MEDICION";
            case 11:
                return "TIPO PISO";
            case 12:
                return "Nº DE CAPAS";
            case 13:
                return "ALMACÉN";
            case 14:
                return "ALTURA MÍNIMA";
            case 15:
                return "FECHA COMPRA";
            case 16:
                return "PRECIO";
            case 17:
                return "Nº DE REENC";
            case 18:
                return "KM TOTAL";
            case 19:
                return "DISTRIBUIDOR";
            case 20:
                return "Nº FACTURA";
            case 21:
                return "FECHA REGISTRO";
            default:
                return "";
        }
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return Class.class;
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Neumaticos aux;
        aux = (Neumaticos) (datos.get(rowIndex));
        Format formatter;
        formatter = new SimpleDateFormat("dd/MM/yyyy");
        switch (columnIndex) {
            case 1:
                return aux.getId();
            case 2:
                return aux.getCodigo() == null ? "" : aux.getCodigo();
            case 3:
                return aux.getNumSerie();
            case 4:
                return aux.getIdModelo().getMedida();
            case 5:
                return aux.getIdMarca().getNombre();
            case 6:
                return aux.getIdCategoria().getNombre();
            case 7:
                String codigo = "";
                if(aux.getIdCategoria().getId().equals(Constantes.CATEGORIA_MONTADO) && aux.getCodigoVehiculo() != null && !aux.getCodigoVehiculo().isEmpty()){//Si está montado
                    codigo = aux.getCodigoVehiculo();
                }
                return codigo;
            case 8:
                String placa = "";
                if(aux.getIdCategoria().getId().equals(Constantes.CATEGORIA_MONTADO) && aux.getInfMontaje() != null && !aux.getInfMontaje().isEmpty()){//Si está montado
                    placa = aux.getInfMontaje();
                }
                return placa;
            case 9:
                String pos = "";
                if(aux.getIdCategoria().getId().equals(Constantes.CATEGORIA_MONTADO) && aux.getPosicion() != null){//Si está montado
                    pos = (aux.getPosicion() <= 0) ? "R" : aux.getPosicion() + "";
                }
                return pos;
            case 10:
                return aux.getIdEstadoMedicion().getNombre();
            case 11:
                return aux.getTipoPiso().getNombre();
            case 12:
                return aux.getNumCapas();
            case 13:
                return aux.getIdAlmacen().getNombre();
            case 14:
                Double alturaMinima = aux.getLabradoCentral();
                if(alturaMinima != null && aux.getLabradoExterior() != null && aux.getLabradoExterior() < alturaMinima){
                    alturaMinima = aux.getLabradoExterior();
                }
                if(alturaMinima != null && aux.getLabradoInterno() != null && aux.getLabradoInterno() < alturaMinima){
                    alturaMinima = aux.getLabradoInterno();
                }
                return (alturaMinima != null && alturaMinima == 0) ? null : alturaMinima;
            case 15:
                Date fecha_compra = aux.getFechaCompra();
                if (fecha_compra != null) {
                    String s2 = formatter.format(aux.getFechaCompra());
                    return s2;
                } else {
                    return "";
                }
            case 16:
                return aux.getPrecio();
            case 17:
                return aux.getNumRenovaciones();
            case 18:
                return ((aux.getKmTotal() == null ? 0 : aux.getKmTotal()) + (aux.getDistanciaRecorrida() == null ? 0 : aux.getDistanciaRecorrida()));
            case 19:
                return (aux.getIdDistribuidor() == null)? "" : aux.getIdDistribuidor().getNombre();
            case 20:
                return aux.getNumFactura();
            case 21:
                Date s1 = aux.getFechaRegistro();
                if (s1 != null) {
                    String s2 = formatter.format(aux.getFechaRegistro());
                    return s2;
                } else {
                    return "";
                }
            default:
                return "";
        }

    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Neumaticos aux;
        aux = (Neumaticos) (datos.get(rowIndex));
        TableModelEvent evento = new TableModelEvent(this, rowIndex, rowIndex, columnIndex);
        avisaSuscriptores(evento);
    }

    private void avisaSuscriptores(TableModelEvent evento) {
        int i;
        for (i = 0; i < listeners.size(); i++) {
            ((TableModelListener) listeners.get(i)).tableChanged(evento);
        }
    }

    @Override
    public void addTableModelListener(TableModelListener l) {
        listeners.add(l);
    }

    @Override
    public void removeTableModelListener(TableModelListener l) {
        listeners.remove(l);
    }

    public void agregarNeumatico(Neumaticos evt) {
        datos.add(evt);
        TableModelEvent evento;
        evento = new TableModelEvent(this, this.getRowCount() - 1, this.getRowCount() - 1, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);
        avisaSuscriptores(evento);
    }

    public void actualizarNeumatico(Neumaticos evt, int row) {
//        datos.add(row, evt);
        datos.set(row, evt);
        TableModelEvent evento;
        evento = new TableModelEvent(this, this.getRowCount() - 1, this.getRowCount() - 1, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);
        avisaSuscriptores(evento);
    }

    public void borrarAccion(int fila) {
        datos.remove(fila);
        TableModelEvent evento = new TableModelEvent(this, fila, fila, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE);
        avisaSuscriptores(evento);
    }

    public int obtenerId(int rowIndex) {
        Neumaticos aux;
        aux = (Neumaticos) (datos.get(rowIndex));
        return aux.getId();
    }

    public void limpiar() {
        datos.clear();
        TableModelEvent evento;
        evento = new TableModelEvent(this, this.getRowCount() - 1, this.getRowCount() - 1, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE);
        avisaSuscriptores(evento);
    }
}
